//
// Created by zx208 on 2024/10/26.
//
// 循环双链表有一结点的指针为p
// 编写一个函数 实现p与其右边的一个结点进行交换

// 思路： 感觉第一次上手的话 会感觉不知道怎么下手
// 我们要先获得p结点以及p结点的后继结点
// 然后两两交换p结点、q结点的后继结点和q结点、p结点的前继结点
// 最后注意一下p结点的next 以及 q结点的prior

#include "../DoubleLinkedList.h"

DouLinkList Init_DL(DouLinkList L){
    DouLinkList head = (DouLinkList) malloc(sizeof( DNode));
    head->next = head;
    head->prior = head;
    return head;
}

void Insert_DL(DouLinkList L, ElemType e){
    DouLinkList p = (DouLinkList) malloc(sizeof( DNode));
    p->data = e;

    // 此部分需要再理解
    p->next = L->next;
    p->prior = L;
    L->next = p;
    p->next->prior = p;
}

void Print_DL(DouLinkList L){
    DNode *node = L->next;
    while(node != L){
        printf("%d ", node->data);
        node = node->next;
    }
    printf("\n");
}

void Swap_Node_DL(DouLinkList L, int pos){
    DouLinkList p = L->next;
    int i = 0;

    while(i < pos-1) p = p->next, i++;

    DouLinkList q = p->next;

    // 在这里 还需要判断p结点是否有后继结点 在这里就直接忽略
    p->next = q->next;
    p->next->prior = p;
    p->prior->next = q;
    q->prior = p->prior;
    p->prior = q;
    q->next = p;
}

int main(void){
    DouLinkList L = NULL;
    L = Init_DL(L);
    Insert_DL(L, 1);
    Insert_DL(L, 2);
    Insert_DL(L, 3);
    Insert_DL(L, 4);
    Print_DL(L);
    Swap_Node_DL(L, 1);
    Print_DL(L);
    return 0;
}